\indent En esta secci\'on contestaremos las preguntas realizadas por la c\'atedra para cada ejercicio.\\


\indent \textbf{Pregunta 1:} ¿Qu\'e ocurre si se intenta escribir en la fila 26, columna 1 de la matriz de video, utilizando el usando el segmento de la GDT que direcciona a la memoria de video? ¿Por qu\'e?\\

\indent Si se intenta escribir en la fila 26 columna 1 se produce una falla pues se esta violando el limite del segmento de video. Se esta intentando acceder fuera del rango permitido, a una posici\'on fuera del segmento de video, por lo que se va a obtener un error de General Protection.\\



\indent  \textbf{Pregunta 2:} ¿Qu\'e ocurre si no se setean todos los registros de segmento al entrar en modo protegido? ¿Es necesario setearlos todos? ¿Por qué?\\


\indent Si, porque cada uno de estos registros especifican un tipo de segmento del programa. As\'i, por ejemplo, el registro CS apunta siempre al segmento de c\'odigo actual, el registro SS apunta al segmento de pila, el DS a los datos y el resto suelen ser auxiliares para realizar diversas operaciones de datos entre segmentos, o acceder a los datos al igual que DS.\\



\indent  \textbf{Pregunta 3:} ¿C\'omo se puede hacer para generar una excepcion sin utilizar la instrucci\'on int? Mencionar al menos 3 formas posibles.\\


  \indent Para generar una excepci\'on sin usar la instrucci\'on \texttt{int} hay que generar los errores los cuales las excepciones manejan. Por ejemplo:
  \begin{itemize}
    \item hacer una divisi\'on por cero. Esto es equivalente a llamar a \texttt{int 0x00}.
    \item Si usamos paginaci\'on, tratar de leer o escribir a una p\'agina que no est\'a mapeada (el flag \texttt{P} de la entrada del directorio o tabla correspondiente no est\'a seteado.). Es equivalente a ejecutar \texttt{int 14}.
    \item Escribir en un segmento de datos de solo lectura. Para esto cargamos uno de los registros de segmento de datos con el descriptor de segmento de solo lectura y luego escribimos ah\'i. Por ejemplo, 
    \begin{itemize}
      \item \texttt{mov ax, des\_solo\_lectura}
      \item \texttt{mov ds, ax}
      \item \texttt{mov ds:[edi], 0}
    \end{itemize}
    Esto genera una \textit{General Protection Exception}. 
  \end{itemize}






\indent  \textbf{Pregunta 4:} ¿Cu\'ales son los valores del stack cuando se genera una interrupci\'on? ¿Qu\'e significan? (indicar para el caso de operar en nivel 3 y nivel 0)\\

\indent En la stack se guarda la información necesaria para retornar de una
interrupción. Por eso, una interrupción pushea los registros necesarios para que
esto suceda.\\

\indent A si se verá la stack si hay cambio de privilegios a la hora de atender la interrupción.

  \begin{center}
    \begin{tabular}{|c|c|}
	\hline
	\texttt{+20} & \texttt{Viejo SS} \\
	\hline
	\texttt{+16} & \texttt{Viejo ESP} \\
	\hline
	\texttt{+12} & \texttt{Viejo EFLAGS} \\
	\hline
	\texttt{+8} & \texttt{Viejo CS} \\
	\hline
	\texttt{+4} & \texttt{Viejo EIP} \\
	\hline
	\texttt{0} & \texttt{Error Code} \\
	\hline	
    \end{tabular}
  \end{center}


\indent De no haber cambios de privilegio, se verá de la siguiente forma:

  \begin{center}
    \begin{tabular}{|c|c|}
	\hline
	\texttt{+20} & \\
	\hline
	\texttt{+16} &  \\
	\hline
	\texttt{+12} & \texttt{Viejo EFLAGS} \\
	\hline
	\texttt{+8} & \texttt{Viejo CS} \\
	\hline
	\texttt{+4} & \texttt{Viejo EIP} \\
	\hline
	\texttt{0} & \texttt{Error Code} \\
	\hline	
    \end{tabular}
  \end{center}

\indent \textbf{Pregunta 5:} ¿Puede el directorio de p\'aginas estar en cualquier posici\'on arbitraria de memoria?\\

\indent No, no es posible. Esto es así pues el directorio debe estar ubicado en una posición de memoria alineada a 4K, es decir, sus últimos 12 bits deben ser 0. \\
%\indent Mientras no se pise con el kernel y el bootsector, el directorio de páginas podría estar en cualquier posición de la memoria. Hay que estar atento a no pisar su dirección con datos o código. Es preferible reservar cierta parte de la memoria para declarar los directorios de páginas y tablas, para evitar que este tipo de situaciones suceda.


\indent \textbf{Pregunta 6:} ¿Es posible acceder a una p\'agina de nivel de kernel desde usuario?\\

\indent No es posible acceder a una página de nivel kernel desde usuario, ya
que de ser así, podríamos modificar datos o código de mayor privilegio.\\
\indent Para corroborar esto se hace un chequeo de privilegios usando el CPL.\\

\indent \textbf{Pregunta 7:} ¿Se puede mapear una p\'agina f\'isica desde dos direcciones virtuales distintas, tal que una este mapeada con nivel de usuario y la otra a nivel de kernel? De ser posible, ¿Qu\'e problemas puede traer?\\

\indent Este mapeo es posible, a través de dos diferentes directorios de páginas. El problema que trae este tipo de prácticas, es que nos permite modificar el código que se encuentra en la posición física tanto desde nivel usuario como de nivel kernel, pisando así datos que posiblemente queríamos proteger al poner que su acceso sea desde kernel.\\

\indent \textbf{Pregunta 8:} ¿Qu\'e permisos pueden tener las tablas y directorios de paginas? ¿Cuales son los permisos efectivos de una direccion de memoria segun los permisos del directorio y tablas de paginas?\\

\indent Las tablas y directorios sólo pueden tener permisos de usuario o supervisor (bit 2 de PDE y PTE) 
y los permisos de una dirección de memoria dependerán del de nivel asignado en la PTE que direcciona a la página
que contiene a esa dirección. \\


\indent \textbf{Pregunta 9:} ¿Es posible desde dos directorios de p\'agina, referenciar a una misma tabla de p\'aginas?\\

\indent Sí, es posible desde dos directorios distintos referenciar a la misma tabla de p\'aginas, pues la
entrada del directorio contiene la direcci\'on f\'isica de dicha tabla de p\'aginas. El problema es que 
compartirían las mismas páginas y esto puede ocasionar errores de sobreescritura de datos si no se maneja cuidadosamente.\\



\indent \textbf{Pregunta 10:} ¿Qu\'e es el TLB (Translation Lookaside Buffer) y para qu\'e sirve?\\

\indent La Translation Lookaside Buffer - TLB es una memoria cache administrada por la MMU que almacena las m\'as recientemente utilizadas entradas de directorios de páginas y tabla de páginas. Sirve para agilizar la traducci\'on de direccion virtual a direcci\'on f\'isica. En caso de que la TLB no
contenga la informacion para hacer la traduccion se termina consultando al directorio de p\'aginas y a la tabla de p\'aginas. Esto \'ultimo consume mas ciclos de reloj del procesador.\\



\indent \textbf{Pregunta 11:} ¿Qu\'e pasa si en la interrupci\'on de teclado no se lee la tecla presionada?\\

\indent Aunque no se lea la tecla al ser presionada, el buffer de entrada del teclado almacena el código de la tecla apretada. En un futuro cuando se aprete otra tecla y se quiera leer, como los elementos almacenados en el buffer se leen en orden, este tendrá almacenado en primer lugar la tecla presionada anteriormente, siendo el código de la misma el que será devuelto (y no el de la tecla realmente presionada). \\
%\indent Si no se lee la tecla presionada, no podremos actuar en función a ella, por lo que se retornará de la interrupción sin que haya cambio alguno.\\

\indent \textbf{Pregunta 12:} ¿Qu\'e pasa si no se resetea el PIC?\\

\indent Si no se resetea el PIC no se remapean las interrupciones, que de la 0 a 31 estan reservadas para el procesador y de la 8 a 15 por las excepciones dedl mismo, asique se debe resetearlo para evitar los conflictos entre las interrupciones.\\

\indent \textbf{Pregunta 13:} Colocando un breakpoint luego de cargar una tarea, ¿c\'omo se puede verificar, utilizando el debugger de Bochs, que la tarea se cargo correctamente? ¿C\'omo se llega a esta conclusion?\\

\indent Podemos utilizar la función \emph{info gdt} y verificar que la entrada de la TSS de 
la tarea cargada aparezca como \emph{busy}. Esto quiere decir que se está corriendo la tarea cargada\\


\indent \textbf{Pregunta 14:} ¿C\'omo se puede verificar si la conmutaci\'on de tarea fue exitosa?\\

\indent Con \emph{info tss} podemos leer el contenido de la TSS de la tarea
que actualmente se está ejecutando. El TR debe indicarnos el índice de la nueva
tarea a la que saltamos. De está forma se puede chequear que la 
conmutación haya sido correcta, además de chequear con \emph{info gdt} que 
la tarea en estado \emph{busy} sea la nueva tarea.\\

\indent \textbf{Pregunta 15:} Se sabe que las tareas llaman a la interrupci\'on 0x80 y 0x90. ¿Qu\'e ocurre si esta no esta implementada? ¿Por qu\'e?\\

\indent Las tareas llaman a las interrupciones 0x80 y 0x90 para usar los servicios del sistema.
Esta interrupci\'on tiene un descriptor en la IDT en nivel usuario, por lo cual
puede ser accedido por las tareas. Si no estuvieran implementadas estas interrupciones,
las tareas no podrían utilizar los servicios del sistema, como infectar una posici\'on del tablero (usando la opci\'on de ``duplicar'' o ``migrar'') o empezar y terminar el juego (servicios usados por el arbitro), por lo que 
no se podr\'ia empezar el juego y las tareas no podr\'ian jugar.



